<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    var anotherObject = {
        a:2
    }
    //创建一个关联到anotherObject的对象
    var myObject = Object.create(anotherObject)
    // 所有普通的prototype链都会指向内置的Object.prototype
    // 由于所有的普通对象都源于Object.prototype对象 所以它包含JS中许多通用的功能
    for(var k in myObject){
       console.log("found:" + k)
    }
    
    Object.defineProperty(anotherObject,"a",{
        writable:true,
        value:3
    })
    console.log("initAnotherObject.a:" + anotherObject.a)
    var childObject = Object.create(anotherObject)
    console.log("initchildObject.a:" + childObject['a'])
    console.log("childObject.hasOwnProperty('a'):" +childObject.hasOwnProperty('a'))   
    childObject.a++ 
    console.log("anotherObject.a:" + anotherObject.a);
    console.log(childObject.a);
    //尽管childObject看起来应该通过委托 查找并增加anotherObject.a属性
    //但是别忘了++操作相当于childObject.a = childObject.a + 1 
    //因此++操作首先会通过Prototype查找a属性并从anotherObject.a获取当前属性值3
    //然后给这个值＋1 接着用[put]将值4赋给childObjcet中新建的屏蔽属性a
    console.log("after childObject.hasOwnProperty:" + childObject.hasOwnProperty('a'))

     Object.defineProperty(anotherObject,"a",{
        //只读属性会阻止Prototype链下层隐式的创建同名属性
        //这样做主要是为了模拟类属性的继承
        //你可以把原型链上的a看作是父类中的属性 它会被newObject继承
        //这样一来newObject中的a的属性也是只读 所以无法创建
        writable:false,
         value:5
     })
     //调用Object.create()会凭空创造一个新对象并把新对象内部的prototype关联到指定的对象
     var newObject =Object.create(anotherObject)
     console.log("init anotherObject.a: " +  anotherObject.a)
     console.log("newObject has a?" + newObject.hasOwnProperty('a'))
     newObject.a ++;
     console.log("after:newObject has a?" + newObject.hasOwnProperty('a'));
    
</script>
</html>